/*******************************************************************************
  * 文件：NetComm_Message.c
  * 作者：zyz
  * 版本：v1.0.0
  * 日期：2017-08-03
  * 说明：消息
*******************************************************************************/
/* 头文件 *********************************************************************/
#include "NetComm_Message.h"
#include "NetComm_Comm.h"
#include "NetComm_Device.h"
#include "NetComm_WiFiCfg.h"
#include "StateMachine.h"
//#include "JumpFunction.h"
#include "DevInfor.h"
#include "Hardware.h"
#include "Comfun.h"
#include <string.h>
/* 宏定义 *********************************************************************/
/* 类型定义 *******************************************************************/
/* 变量定义 *******************************************************************/
/* 函数声明 *******************************************************************/
/* 函数定义 *******************************************************************/

/*******************************************************************************
  * 函数名：NetComm_SetDevStatusMsg
  * 功  能：设置设备状态
  * 参  数：U8* pu8MsgData - 消息数据
  * 返回值：无
  * 说  明：命令 0x01
*******************************************************************************/
void NetComm_SetDevStatusMsg(U8* pu8MsgData)
{
    U8* pu8Data;
    U16 u16Type = (U16)Get_BigEndian_Value(pu8MsgData,2);

    if(U16_NETCOMM_CMD_01_GET_STATUS != u16Type)
    {
        // WiFi模块设置设备状态
        U16  u16SetData  = (U16)Get_BigEndian_Value(pu8MsgData+2,2); 	// 设置数据域
        Bool bDevSetFlag = NetComm_SetDevStatus(u16Type,u16SetData);	// 执行设置
        if(!bDevSetFlag)
        {
            //不支持该设置子命令,回复无效命令
            NetComm_SendInvalidCmdMsg();
            return;
        }
    }
	// 更新设备状态数据
    NetComm_UpdataStatusData();
    // 构建发送数据包
    pu8Data = NetComm_SetupSendPacket(U8_NETCOMM_CMD_02_REPLY_DEV_STATUS);
    // 固定字段
    *pu8Data++ = 0x6D;
    *pu8Data++ = 0x01;
    // 发送设备状态数据
    pu8Data += NetComm_GetDevStatus(pu8Data);
    // 发送数据包
    NetComm_SendPacket(pu8Data);
}

/*******************************************************************************
  * 函数名：NetComm_InvalidCMD
  * 功  能：无效帧
  * 参  数：U8* pu8MsgData - 消息数据
  * 返回值：无
  * 说  明：命令 0x03
*******************************************************************************/
void NetComm_InvalidCMD(U8* pu8MsgData)
{

}

/*******************************************************************************
  * 函数名：NetComm_AckMsg
  * 功  能：确认帧
  * 参  数：U8* pu8MsgData - 消息数据
  * 返回值：无
  * 说  明：命令 0x05
*******************************************************************************/
void NetComm_AckMsg(U8* pu8MsgData)
{
    // 检查设备是否处于故障模式
    if(TRUE == NetComm_IsDevError())
    {
        // 设备故障报警时的ACK，认为修改报警时间
        NetComm_ChangeAlarm();
    }
}

/*******************************************************************************
  * 函数名：NetComm_StopAlarmMsg
  * 功  能：停止报警
  * 参  数：U8* pu8MsgData - 消息数据
  * 返回值：无
  * 说  明：命令 0x09
*******************************************************************************/
void NetComm_StopAlarmMsg(U8* pu8MsgData)
{
    NetComm_StopAlarm();
}

/*******************************************************************************
  * 函数名：NetComm_GroupCmdMsg
  * 功  能：组命令
  * 参  数：U8* pu8MsgData - 消息数据
  * 返回值：无
  * 说  明：命令 0x60
*******************************************************************************/
void NetComm_GroupCmdMsg(U8* pu8MsgData)
{
}

/*******************************************************************************
  * 函数名：NetComm_QueryDevVerMsg
  * 功  能：查询设备版本
  * 参  数：U8* pu8MsgData - 消息数据
  * 返回值：无
  * 说  明：命令 0x61
*******************************************************************************/
void NetComm_QueryDevVerMsg(U8* pu8MsgData)
{
    U8* pu8Data = NULL;
    
    // 构建发送数据包
    pu8Data = NetComm_SetupSendPacket(U8_NETCOMM_CMD_62_REPLY_DEV_VER);
	//清空数据域 本次数据域38B
	memset(pu8Data,0x00,38);
    // 设置数据
    // 设备协议版本（8B）
    Dev_GetUPlusVer(pu8Data);
    pu8Data += 8;
    // 设备软件版本,此处默认置零（8B）
    memset(pu8Data,0x00,8);
    pu8Data += 8;
    // 加密标志（3B）
    *pu8Data++ = 0xF1;    // 不支持加密
    *pu8Data++ = 0x00;
    *pu8Data++ = 0x00;
    // 设备硬件版本,此处默认置零（8B）
    memset(pu8Data,0x00,8);
    pu8Data += 8;
    // 模块与底板交互方式(00:交互,01:主从)
    *pu8Data++ = 0x00;
    // SoftAp配置模式时设备的名称（8B）
    Dev_GetSoftAP(pu8Data);
    pu8Data += 8;
    // 设备功能信息
    *pu8Data++ = 0x00;
    *pu8Data++ = 0x08; // 支持升级,不支持CRC校验
    // 发送数据包，pu8Data指向校验位
    NetComm_SendPacket(pu8Data); 
}

/*******************************************************************************
  * 函数名：NetComm_QueryDevIDMsg
  * 功  能：查询设备识别码
  * 参  数：U8* pu8MsgData - 消息数据
  * 返回值：无
  * 说  明：命令 0x70
*******************************************************************************/
void NetComm_QueryDevIDMsg(U8* pu8MsgData)
{
    U8* pu8Data = NULL;

    // 构建发送数据包
    pu8Data = NetComm_SetupSendPacket(U8_NETCOMM_CMD_71_REPLY_DEV_ID);
    memset(pu8Data,0x00,32);
    // 设置数据
    // TYPEID（32B）
    Dev_GetTypeID(pu8Data);
    pu8Data += 32;
    // 发送数据包
    NetComm_SendPacket(pu8Data);
}

/*******************************************************************************
  * 函数名：NetComm_QueryAlarmStatusMsg
  * 功  能：查询报警状态
  * 参  数：U8* pu8MsgData - 消息数据
  * 返回值：无
  * 说  明：命令 0x73
*******************************************************************************/
void NetComm_QueryAlarmStatusMsg(U8* pu8MsgData)
{
    U8* pu8Data = NULL;

	// 更新设备报警信息
	NetComm_UpdataAlarmStatusData();
    // 构建发送数据包
    pu8Data = NetComm_SetupSendPacket(U8_NETCOMM_CMD_74_REPLY_ALARM_STATUS);
    // 固定字段，子命令
    *pu8Data++ = 0x0F;
    *pu8Data++ = 0x5A;
    // 报警信息
    pu8Data += NetComm_GetAlarmStatus(pu8Data);
    // 发送数据包
    NetComm_SendPacket(pu8Data);
}

/*******************************************************************************
  * 函数名：NetComm_CfgDevStatusRptMsg
  * 功  能：配置设备状态汇报
  * 参  数：U8* pu8MsgData - 消息数据
  * 返回值：无
  * 说  明：命令 0x7C，已取消设备状态定时上报，定时时间固定为0
*******************************************************************************/
void NetComm_CfgDevStatusRptMsg(U8* pu8MsgData)
{
    U8* pu8Data = NULL;
	U16 u16Time;
	
    // 构建发送数据包
    pu8Data = NetComm_SetupSendPacket(U8_NETCOMM_CMD_7D_REPLY_CFG_DEV_STATUS_RPT);
    // 汇报时间固定为0
	u16Time = 0;
	//大端存放
	Put_BigEndian_Val(u16Time,pu8Data,sizeof(u16Time));
	//指向校验和
	pu8Data += 2;
    // 发送数据包
    NetComm_SendPacket(pu8Data);
}

/*******************************************************************************
  * 函数名式：NetComm_ReplyEnterCfgModeMsg
  * 功  能：应答进入配置模
  * 参  数：U8* pu8MsgData - 消息数据
  * 返回值：无
  * 说  明：命令 0xF3
*******************************************************************************/
void NetComm_ReplyEnterCfgModeMsg(U8* pu8MsgData)
{

}

/*******************************************************************************
  * 函数名：NetComm_ReplyEnterWorkModeMsg
  * 功  能：应答进入工作模式
  * 参  数：U8* pu8MsgData - 消息数据
  * 返回值：无
  * 说  明：命令 0xF5
*******************************************************************************/
void NetComm_ReplyEnterWorkModeMsg(U8* pu8MsgData)
{

}

/*******************************************************************************
  * 函数名：NetComm_RptNetStatusMsg
  * 功  能：汇报网络状态
  * 参  数：U8* pu8MsgData - 消息数据
  * 返回值：无
  * 说  明：命令 0xF7
*******************************************************************************/
void NetComm_RptNetStatusMsg(U8* pu8MsgData)
{
    // 网络状态
    U16 u16NetStatus = Get_BigEndian_Value(pu8MsgData, 2);

    // 更新应用层网络状态
    switch (u16NetStatus)
    {
    case U16_NETCOMM_NETSTATUS_OK:
        NetComm_SetWifiStatus(eWIFI_OK);
	break;
    case U16_NETCOMM_NETSTATUS_NO_AP:
        NetComm_SetWifiStatus(eWIFI_NOAP);
	break;
    case U16_NETCOMM_NETSTATUS_NO_SERVER:
        NetComm_SetWifiStatus(eWIFI_NOSERVER);
	break;
    case U16_NETCOMM_NETSTATUS_CFG:
        NetComm_SetWifiStatus(eWIFI_CFG);
	break;
    }
    
    // 回复确认帧
    NetComm_SendAckMsg();
}

/*******************************************************************************
  * 函数名：FotaHandler_Hook2S
  * 功  能：FOTA延时启动
  * 参  数：U32 arg ：保留
  * 返回值：无
  * 说  明：设备启动立即升级，延迟两秒跳转至BootLoader
*******************************************************************************/
//static Timer_ts sFotaTimer;
//static void FotaHandlerHook_2S(U32 arg)
//{
//	// JumpToBootloader();
//}

/*******************************************************************************
  * 函数名：NetComm_RequestUpgradeMsg
  * 功  能：请求升级消息
  * 参  数：U8* pu8MsgData - 消息数据
  * 返回值：无
  * 说  明：命令 0xE1
*******************************************************************************/
void NetComm_RequestUpgradeMsg(U8* pu8MsgData)
{
//	//升级包状态：0未下载 1已下载
//	U8 u8UpgradePackStatus = *(pu8MsgData+34);
//	//升级方式
//	U8 u8UpgradeMode = *(pu8MsgData+35);
//	//设备当前状态
//	U8 u8CurState = StateMachine_GetCurState();
//	//发送包数据
//	U8* pu8Data = NULL;
//	
//	//构建发送数据包
//    pu8Data = NetComm_SetupSendPacket(U8_NETCOMM_CMD_E2_RES_UPGRADE);
//	
//    // 判断升级状态
//    // ***
//    
//	// 发送数据包
//	NetComm_SendPacket(pu8Data);
}

/*******************************************************************************
  * 函数名：NetComm_QueryMachineInfoMsg
  * 功  能：查询整机信息
  * 参  数：U8* pu8MsgData - 消息数据
  * 返回值：无
  * 说  明：命令 0xEB
*******************************************************************************/
void NetComm_QueryMachineInfoMsg(U8* pu8MsgData)
{
    U8* pu8Data = NULL;
    
    // 构建发送数据包
    pu8Data = NetComm_SetupSendPacket(U8_NETCOMM_CMD_EC_REPLY_MACHINE_INFO);
	memset(pu8Data,0x00,37);
    // 整机型号编码,全置零
	//memset(pu8Data,0x00,20);
	strcpy((char*)pu8Data,"FB2863019");
	pu8Data += 20;
    // 整机固件版本号，固定（14byte）
	*pu8Data++ = 0;
    *pu8Data++ = 1;
    *pu8Data++ = 0;
    *pu8Data++ = 0;
    *pu8Data++ = 0;
    *pu8Data++ = 0;
    *pu8Data++ = 0;
    *pu8Data++ = 0;
    *pu8Data++ = 0;
    *pu8Data++ = 0;
    *pu8Data++ = 0;
    *pu8Data++ = 0;
    *pu8Data++ = 0;
    *pu8Data++ = 0;
    // 支持的升级包版本号（2byte）
    *pu8Data++ = 0;
    *pu8Data++ = 0;
    // 子机数量（1byte）
    *pu8Data++ = 1;
	// 子机编号（1byte）
    *pu8Data++ = 0;
    // 发送数据包
    NetComm_SendPacket(pu8Data);
}

/*******************************************************************************
  * 函数名：NetComm_QuerySlaveInfoMsg
  * 功  能：查询子机信息
  * 参  数：U8* pu8MsgData - 消息数据
  * 返回值：无
  * 说  明：命令 0xE9
*******************************************************************************/
void NetComm_QuerySlaveInfoMsg(U8* pu8MsgData)
{
/*
	U8* pu8Data;
    U8 u8Index;
    ImageHeader_ts *psApplicationHeader;

    // 获取header
    psApplicationHeader = (ImageHeader_ts*)u32APPLICATION_HEADER_ADDRESS;

    // 判断子机号
    if(pu8MsgData[0] == 0)
    {
        // 构建发送数据包
        pu8Data = NetComm_SetupSendPacket(U8_NETCOMM_CMD_EA_REPLY_SLAVE_INFO);
        // 子机号（1byte）
        *pu8Data++ = 0;
        // 子机软件标识符（20byte）,前14byte为专用号，后6byte为方案代码
        for(u8Index=0; u8Index<16; u8Index++)
        {
            *pu8Data++ = psApplicationHeader->au8BoardNumber[u8Index];
        }
		*pu8Data++ = 0;
		*pu8Data++ = 0;
		*pu8Data++ = 0;
		*pu8Data++ = 0;
        // 子机软件版本号（14byte），前6byte为主，次，修订版本号，各占2byte，后8为延伸版本号
        *pu8Data++ = (U8)(psApplicationHeader->u8SwMajorVersion/10);
        *pu8Data++ = (U8)(psApplicationHeader->u8SwMajorVersion%10);
        *pu8Data++ = (U8)(psApplicationHeader->u8SwMinorVersion/10);
        *pu8Data++ = (U8)(psApplicationHeader->u8SwMinorVersion%10);
        *pu8Data++ = (U8)(psApplicationHeader->u8SwRevisionVersion/10);
        *pu8Data++ = (U8)(psApplicationHeader->u8SwRevisionVersion%10);

        *pu8Data++ = 0;
        *pu8Data++ = 0;
        *pu8Data++ = 0;
        *pu8Data++ = 0;
        *pu8Data++ = 0;
        *pu8Data++ = 0;
        *pu8Data++ = 0;
        *pu8Data++ = 0;
        // 是否支持升级（1byte）
        *pu8Data++ = 0x01;    // 支持升级
        // 发送数据包
        NetComm_SendPacket(pu8Data);
    }
*/
}

/*******************************************************************************
  * 函数名：NetComm_SendAckMsg
  * 功  能：发送确认帧
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void NetComm_SendAckMsg(void)
{
    U8* pu8Data;

    // 构建发送数据包
    pu8Data = NetComm_SetupSendPacket(U8_NETCOMM_CMD_05_ACK);
    // 发送数据包
    NetComm_SendPacket(pu8Data);
}

/*******************************************************************************
  * 函数名：NetComm_SendInvalidCmdMsg
  * 功  能：发送“无效命令”消息
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void NetComm_SendInvalidCmdMsg(void)
{
    U8* pu8Data;

    // 构建发送数据包
    pu8Data = NetComm_SetupSendPacket(U8_NETCOMM_CMD_03_INVALID_CMD);
    // 无效信息
    *pu8Data++ = 0x00;
    *pu8Data++ = 0x00;
    // 发送数据包
    NetComm_SendPacket(pu8Data);
}

/*******************************************************************************
  * 函数名：NetComm_SendEnterCfgModeMsg
  * 功  能：发送“进入配置模式”消息
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void NetComm_SendEnterCfgModeMsg(void)
{
    U8* pu8Data;

    // 构建发送数据包
    pu8Data = NetComm_SetupSendPacket(U8_NETCOMM_CMD_F2_ENTER_CFG_MODE);
    // 配置模式 softAP
    *pu8Data++ = 0x00;
    *pu8Data++ = 0x00;
    // 发送数据包
    NetComm_SendPacket(pu8Data);
}

/*******************************************************************************
  * 函数名：NetComm_SendEnterWorkModeMsg
  * 功  能：发送“进入工作模式”消息
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void NetComm_SendEnterWorkModeMsg(void)
{
    U8* pu8Data;

    // 构建发送数据包
    pu8Data = NetComm_SetupSendPacket(U8_NETCOMM_CMD_F4_ENTER_WORK_MODE);
    // 发送数据包
    NetComm_SendPacket(pu8Data);
}

/*******************************************************************************
  * 函数名：NetComm_SendClearCfgInfoMsg
  * 功  能：发送“清除配置信息”消息
  * 参  数：无
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void NetComm_SendClearCfgInfoMsg(void)
{
    U8* pu8Data;

    // 构建发送数据包
    pu8Data = NetComm_SetupSendPacket(U8_NETCOMM_CMD_F8_CLEAR_CFG_INFO);
    // 发送数据包
    NetComm_SendPacket(pu8Data);
}
/*******************************************************************************
  * 函数名：NetComm_SendAlarmStatusMsg
  * 功  能：发送“报警状态”消息
  * 参  数：U32 arg
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void NetComm_SendAlarmStatusMsg(void)
{
    U8* pu8Data = NULL;

    // 构建发送数据包
    pu8Data = NetComm_SetupSendPacket(U8_NETCOMM_CMD_04_RPT_ALARM_STATUS);
    // 固定字段
    *pu8Data++ = 0x0F;
    *pu8Data++ = 0x5A;
    // 报警状态数据
    pu8Data += NetComm_GetAlarmStatus(pu8Data);
    // 发送数据包
    NetComm_SendPacket(pu8Data);
}

/*******************************************************************************
  * 函数名：NetComm_SendDevStatusMsg
  * 功  能：发送“设备状态”消息
  * 参  数：U32 arg
  * 返回值：无
  * 说  明：无
*******************************************************************************/
void NetComm_SendDevStatusMsg(void)
{
    U8* pu8Data = NULL;

    // 构建发送数据包
    pu8Data = NetComm_SetupSendPacket(U8_NETCOMM_CMD_06_RPT_STATUS_INFO);
    // 固定字段
    *pu8Data++ = 0x6D;
    *pu8Data++ = 0x01;
    // 设备状态数据
    pu8Data += NetComm_GetDevStatus(pu8Data);
    // 发送数据包
    NetComm_SendPacket(pu8Data);
}

